# coding=utf-8
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie, Timeline

# 导入数据
lab_df = pd.read_csv("D:/Courses/SmallThree/scrapy_spider/data.csv", encoding='gbk')

# 计算每年每种类型的数量
data = lab_df.groupby(['year', 'type']).size().reset_index(name='count')
# 初始化一个空的DataFrame来存储累计数量
cumulative_data = pd.DataFrame(columns=['year', 'type', 'cumulative_count']).astype(int)

# 累加每年的每种类型的数量
last_year_counts = {}
for _, row in data.iterrows():
    year = row['year']
    type_name = row['type']
    count = row['count']

    if type_name in last_year_counts:
        cumulative_count = last_year_counts[type_name] + count
    else:
        cumulative_count = count

    last_year_counts[type_name] = cumulative_count
    year_int = int(year)
    cumulative_data = cumulative_data._append({'year': year_int, 'type': type_name, 'cumulative_count': cumulative_count},
                                             ignore_index=True)

# 初始化 Timeline 对象
timeline = Timeline()
timeline.add_schema(
    is_auto_play=True,
    is_loop_play=True,
    is_timeline_show=True,
    play_interval=1000
)

all_types = set(cumulative_data['type'])

# 遍历每一年数据，创建饼图并添加到 Timeline 中
for year in sorted(cumulative_data['year'].unique()):
    # 筛选出到当前年份为止的累计数据
    year_cumulative_data = cumulative_data[cumulative_data['year'] <= year]

    # 创建一个字典来存储当前年份（到当前年份为止）每种类型的累计数量
    year_type_counts = year_cumulative_data.groupby('type')['cumulative_count'].max().to_dict()

    # 初始化pie_data列表，包含所有类型，即使它们的数量为0
    pie_data = [(type_name, year_type_counts.get(type_name, 0)) for type_name in all_types]

    # 检查 pie_data 是否为空（但实际上由于我们包含了所有类型，所以不会为空）
    # ...（这部分可以省略，因为我们已经确保了所有类型都在pie_data中）

    # 打印出 pie_data 以确认（可选）
    # ...（这部分可以保留或省略）

    # 创建 Pie 对象
    pie = (
        Pie()
        .add(
            "",
            pie_data,
            radius=["20%", "75%"],
            center=["50%", "50%"],
            rosetype="radius",
            label_opts=opts.LabelOpts(formatter="{b}: {c}")
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title=f"{year}年及以前不同类型实验室累计占比"),
            legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%")
        )
    )

    # 将饼图添加到 Timeline
    timeline.add(pie, f"{year}")

# 渲染 Timeline 到 HTML 文件
timeline.render("D:/Courses/SmallThree/scrapy_spider/timeline_pie_chart.html")